public class code02 {
//    力扣 150 括号生成
public List<String> generateParenthesis(int n) {
    // 解法一：使用回溯进行解决
    // 首先先来创建一个返回存储数据的顺序表
    List<String> re = new ArrayList<>();

    // 因为这里是 string 类型的返回值，这里就需要使用到 String 元素构建的方法
    StringBuilder s = new StringBuilder();
    // 实现一下回溯方法
    backfunc(re, s, 0, 0, n);

    return re;
}

    // 实现一下回溯方法
    // 简单解释一下参数信息
    // 返回顺序表
    // 构造字符串
    // 左括号起始数量、右括号起始数量
    // 题目要求的括号组数
    private void backfunc(List<String> re, StringBuilder s, int start, int end, int nums) {
        // 首先设定递归返回条件
        if(s.length() == nums * 2) {
            // 这里要求的字符串长度是 nums 的 2 倍(也就是左右括号的总数)
            // 此时将值添加到返回表格中
            re.add(s.toString());
            return;
        }

        if(start < nums) {
            // 左半部分括号的数量需要小于 nums
            s.append('(');
            // 进行深入一层的递归
            // 此时左括号记录数 +1
            backfunc(re, s, start + 1, end, nums);
            // 在添加完一层信息后，需要进行回退操作
            // 清空子串
            s.deleteCharAt(s.length() - 1);
        }

        // 因为右括号数需要小于左括号数，此时就需要通过判断来确定是否放置一个右括号
        // 这里是不能使用 nums 来进行判断的
        if(end < start) {
            // 右半部分括号的数量同样需要小于 nums
            s.append(')');
            // 同样的进行深入一层的递归
            // 此时右括号记录数 +1
            backfunc(re, s, start, end + 1, nums);
            // 在添加完信息后，进行回退操作
            s.deleteCharAt(s.length() - 1);
        }
    }
}
